//
//  XZHomeViewController.m
//  IBeeBo
//
//  Created by Sean on 16/4/4.
//  Copyright © 2016年 Sean. All rights reserved.
//
//URL  https://api.weibo.com/2/users/show.json
/**
 *  请求参数
 必选	        类型及范围	说明
 access_token	true	string	采用OAuth授权方式为必填参数，OAuth授权后获得。
 uid	        false	int64	需要查询的用户ID。
 screen_name	false	string	需要查询的用户昵称。
 注意事项
 参数uid与screen_name二者必选其一，且只能选其一；
 接口升级后，对未授权本应用的uid，将无法获取其个人简介、认证原因、粉丝数、关注数、微博数及最近一条微博内容。
 */
/*2016-04-07 22:38:05.990 XZIBeeBo[9973:586789] 成功{
uid : 2797750974,
expires_in : 157679999,
access_token : 2.00ipE2DD02JOyN0e38dbe9f816XdVB,
remind_in : 157679999
}
*/
/**URL
 https://api.weibo.com/2/statuses/friends_timeline.json
 请求参数
 必选	         类型及范围	说明
 access_token	true	string	采用OAuth授权方式为必填参数，OAuth授权后获得。
 since_id	    false	int64	若指定此参数，则返回ID比since_id大的微博（即比since_id时间晚的微博），默认为0。
 max_id	        false	int64	若指定此参数，则返回ID小于或等于max_id的微博，默认为0。
 count	        false	int	单页返回的记录条数，最大不超过100，默认为20。
 page	        false	int	返回结果的页码，默认为1。
 base_app	    false	int	是否只获取当前应用的数据。0为否（所有数据），1为是（仅当前应用），默认为0。
 feature	    false	int	过滤类型ID，0：全部、1：原创、2：图片、3：视频、4：音乐，默认为0。
 trim_user	    false	int	返回值中user字段开关，0：返回完整user字段、1：user字段仅返回user_id，默认为0。
 */
/*
 获取双向关注用户的最新微博
 URL
 https://api.weibo.com/2/statuses/bilateral_timeline.json
 请求参数
 必选	         类型及范围	说明
 access_token	true	string	采用OAuth授权方式为必填参数，OAuth授权后获得。
 since_id	    false	int64	若指定此参数，则返回ID比since_id大的微博（即比since_id时间晚的微博），默认为0。
 max_id	        false	int64	若指定此参数，则返回ID小于或等于max_id的微博，默认为0。
 count	        false	int	单页返回的记录条数，最大不超过100，默认为20。
 page	        false	int	返回结果的页码，默认为1。
 base_app	    false	int	是否只获取当前应用的数据。0为否（所有数据），1为是（仅当前应用），默认为0。
 feature	    false	int	过滤类型ID，0：全部、1：原创、2：图片、3：视频、4：音乐，默认为0。
 trim_user	    false	int	返回值中user字段开关，0：返回完整user字段、1：user字段仅返回user_id，默认为0。

 */
#define XZURLUserInfo @"https://api.weibo.com/2/users/show.json"
#define XZURLUserData @"https://api.weibo.com/2/statuses/friends_timeline.json"
//#define XZURLNewData  @"https://api.weibo.com/2/statuses/bilateral_timeline.json"

#import "XZHomeViewController.h"
#import "XZDropdownMenu.h"
#import "XZTitleMeanController.h"
#import "XZAccoutnTool.h"
#import "XZAccoutnModel.h"
#import "XZTitleButton.h"
#import "XZStatusModel.h"
#import "XZUserModel.h"
#import "XZLondMoreFooter.h"
#import "XZHomeStatusCell.h"
#import "MJExtension.h"
#import "XZStatusFrame.h"
#import "XZUISearchBar.h"


@interface XZHomeViewController ()<UITableViewDelegate,UITableViewDataSource,XZDropdownMenuDelegate>
@property (nonatomic,strong) UIButton *titleBtn;
/**
 * 微博数组微博数组（里面放的都是HWStatusFrame模型，一个HWStatusFrame对象就代表一条微博）
 */
@property (nonatomic,strong) NSMutableArray *statusesFrames;
//@property (nonatomic,strong) NSArray *statuses;
@end

@implementation XZHomeViewController
/**
 *  懒加载让数组永远不为空 statusesFrame模型
 */
-(NSMutableArray *)statusesFrames{
    if (!_statusesFrames) {
        self.statusesFrames = [NSMutableArray array];
    }
    return _statusesFrames;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    XZUISearchBar *sear = [XZUISearchBar searchBar];
    sear.width = self.view.width;
    sear.height = 35;
    self.tableView.tableHeaderView = sear;
    
    
    
    
    
    /**中间标题按钮*/
    [self setTitleBtn];
    /**获取用户信息(昵称)*/
    [self setUpUserInfo];
#warning Mark--//暂时不要了
     //加载首页数据
    //[self londUserData];
    
    //集成下拉刷新控件功能
    [self  setUpDownRefreshFresh];
    
    /**集成上拉刷新控件*/
    [self setupUpDownRefreshFresh];
    
    // 获得未读数
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:15 target:self selector:@selector(setupUnreadCount) userInfo:nil repeats:YES];
    // 主线程也会抽时间处理一下timer（不管主线程是否正在其他事件）
    [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

    
}

/**
 *  获取未读数
 */
- (void)setupUnreadCount{
    //self.tabBarItem.badgeValue = @"0";
  
    //    return;
    // 1.请求管理者
    AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
    // 2.拼接请求参数
    XZAccoutnModel *account = [XZAccoutnTool account];
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[@"access_token"] = account.access_token;
    params[@"uid"] = account.uid;
    
    // 3.发送请求
    [mgr GET:@"https://rm.api.weibo.com/2/remind/unread_count.json" parameters:params success:^(AFHTTPRequestOperation *operation, NSDictionary *responseObject) {
      
        // 微博的未读数
        //        int status = [responseObject[@"status"] intValue];
        // 设置提醒数字
        //        self.tabBarItem.badgeValue = [NSString stringWithFormat:@"%d", status];
        
        // @20 --> @"20"
        // NSNumber --> NSString
        // 设置提醒数字(微博的未读数)
        NSString *status = [responseObject[@"status"] description];//description描述
        if ([status isEqualToString:@"0"]) { // 如果是0，得清空数字
            self.tabBarItem.badgeValue = nil;
            [UIApplication sharedApplication].applicationIconBadgeNumber = 0;
        } else { // 非0情况
            self.tabBarItem.badgeValue = status;
            [UIApplication sharedApplication].applicationIconBadgeNumber = status.intValue;
        }
          XZLog(@"获取未读数=%@",status);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        XZLog(@"请求失败-%@", error);
    }];

   

}
/**
 * 集成上拉刷新控件
 */
- (void)setupUpDownRefreshFresh{
    
    XZLondMoreFooter *footer = [XZLondMoreFooter footer];
    footer.hidden = YES;
    footer.width = self.tableView.width;
    footer.height = 35;
    self.tableView.tableFooterView = footer;
    
}
/**
 * 集下拉刷新控件
 */
- (void)setUpDownRefreshFresh{
    //1.apple自带下拉刷新功能ios6开始使用
    UIRefreshControl *refresh = [[UIRefreshControl alloc] init];
    [refresh addTarget:self action:@selector(refreshStateChange:) forControlEvents:UIControlEventValueChanged];
    [self.tableView addSubview:refresh];
    //2.一进入就开始刷新d但是不会触发refreshStateChange不会调这个方法就不会发请求
    [refresh beginRefreshing];
    
    //3.马上加载调用refreshStateChange
    [self refreshStateChange:refresh];
    
}
/**
 *  将HWStatus模型转为HWStatusFrame模型
 */
- (NSArray *)stausFramesWithStatuses:(NSArray *)statuses{

    //statusModel数组转为 statusFrame 数组
    NSMutableArray *Frames = [NSMutableArray array];
    
    for (XZStatusModel *status in statuses) {
        XZStatusFrame *f = [[XZStatusFrame alloc] init];
        f.status = status;
        [Frames addObject:f];
    }
    return Frames;
}

/**
 *  UIRefreshControlapple自带下拉刷新功能事件
 */
- (void)refreshStateChange:(UIRefreshControl *)contrlo{
   // XZLog(@"下拉刷新");
    
    XZAccoutnModel *account = [XZAccoutnTool account];
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

    NSMutableDictionary *parame = [NSMutableDictionary dictionary];
    parame[@"access_token"] = account.access_token;
    //取出最前面的微博 (最新的微博 ID最大的微博
    XZStatusFrame *fistStatusF = [self.statusesFrames firstObject];
  
    if (fistStatusF) { //判断第一次加载是否有第一条微博
        // since_id	    false	int64	若指定此参数，则返回ID比since_id大的微博（即比since_id时间晚的微博），默认为0。
        parame[@"since_id"] = fistStatusF.status.idstr;
    }
   
    [manager GET:XZURLUserData parameters:parame success:^(AFHTTPRequestOperation
                                                           * _Nonnull operation, id  _Nonnull responseObject) {
        //XZLog(@"Data=%@",responseObject);
        //运用MJExtension.h 将字典给我转换成模型 mj_objectArrayWithKeyValuesArray
        //将微博字典数组 转换为 微博模型 数组
        NSArray *newStatuses = [XZStatusModel mj_objectArrayWithKeyValuesArray:responseObject[@"statuses"]];
        
        //statusModel数组转为 statusFrame 数组
        NSArray *newFrames = [self stausFramesWithStatuses:newStatuses];
        /*
        NSMutableArray *newFrame = [NSMutableArray array];
         
        for (XZStatusModel *status in newStatuses) {
            XZStatusFrame *f = [[XZStatusFrame alloc] init];
            f.status = status;
            [newFrame addObject:f];
            
        }
        */
        
        //将微博数据添加到总数组最前面 newStatuses刷新后的新数据
        NSRange rang = NSMakeRange(0, newFrames.count);
        //构造NSIndexSet
        NSIndexSet *set = [NSIndexSet indexSetWithIndexesInRange:rang];
        //注意这里atIndexes 是复数  插入数组前面的方法
        [self.statusesFrames insertObjects:newFrames atIndexes:set];
        
        [self.tableView reloadData];
        //XZLog(@"刷新=%@",responseObject);
        //结束刷新下
        [contrlo endRefreshing];
        //显示最新的微博提示框 传最新微博数
        [self showNewStatusConut:newStatuses.count];
        
    } failure:^(AFHTTPRequestOperation * _Nullable operation, NSError * _Nonnull error) {
        XZLog(@"失败%@",error);
        //结束刷新下
        [contrlo endRefreshing];
    }];

}
/**
 *   显示最新的微博提示框 传最新微博数
 *
 *  @param count newStatuses.count
 */
- (void)showNewStatusConut:(NSUInteger)count {
    // 刷新成功(清空图标数字)
    self.tabBarItem.badgeValue = nil;
    [UIApplication sharedApplication].applicationIconBadgeNumber = 0;

    
    UILabel *newlabel = [[UILabel alloc] init];
    newlabel.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"timeline_new_status_background"]];
    newlabel.width = [UIScreen mainScreen].bounds.size.width;
    newlabel.height = 35;
    
    //设置其他属性
    
    if (count ==0) {
        newlabel.text = @"没有新微博数据...";
    }else {
       newlabel.text = [NSString stringWithFormat:@"共有%lu条微博新数据",count];
    }
    
    newlabel.textColor = [UIColor whiteColor];
    newlabel.font = [UIFont systemFontOfSize:16];
    newlabel.textAlignment = NSTextAlignmentCenter;
    // 3.添加
    newlabel.y = 64 - newlabel.height;
    //[self.navigationController.view addSubview:newlabel];
    // 将label添加到导航控制器的view中，并且是盖在导航栏下边
   [self.navigationController.view insertSubview:newlabel belowSubview:self.navigationController.navigationBar];
 
     // 如果某个动画执行完毕后，又要回到动画执行前的状态，建议使用transform来做动画
    // 4.动画
    // 先利用1s的时间，让label往下移动一段距离
    CGFloat duration = 1.0; // 动画的时间
    [UIView animateWithDuration:duration animations:^{
      newlabel.y += newlabel.height;
      //newlabel.transform = CGAffineTransformMakeTranslation(0, label.height);
    } completion:^(BOOL finished) {
        // 延迟1s后，再利用1s的时间，让label往上移动一段距离（回到一开始的状态）
        CGFloat delay = 1.0; // 延迟1s
        // UIViewAnimationOptionCurveLinear:匀速
        [UIView animateWithDuration:duration delay:delay options:UIViewAnimationOptionCurveLinear animations:^{
         newlabel.y -= newlabel.height;
        //newlabel.transform = CGAffineTransformIdentity;
        } completion:^(BOOL finished) {
            [newlabel removeFromSuperview];
        }];
    }];
    
}
/**
 *  加载首页数据
 */
- (void)londUserData{
    
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    XZAccoutnModel *account = [XZAccoutnTool account];
    NSMutableDictionary *parame = [NSMutableDictionary dictionary];
    parame[@"access_token"] = account.access_token;
    // 取出最后面的微博（最新的微博，ID最大的微博）
    XZStatusFrame *lastStatusF = [self.statusesFrames lastObject];
    if (lastStatusF) {
        // 若指定此参数，则返回ID小于或等于max_id的微博，默认为0。
        // id这种数据一般都是比较大的，一般转成整数的话，最好是long long类型
        long long maxId = lastStatusF.status.idstr.longLongValue - 1;
        parame[@"max_id"] = @(maxId);
    }

    
    //parame[@"count"] = @2;   //2条数据
    [manager GET:XZURLUserData parameters:parame success:^(AFHTTPRequestOperation
                                                           * _Nonnull operation, id  _Nonnull responseObject) {
       /*
        NSArray *dictArray = responseObject[@"statuses"];
        NSMutableArray *newArrayM = [NSMutableArray array];
        for (NSDictionary *dict in dictArray) {
           // XZStatusModel *statusModel = [XZStatusModel statusModelDict:dict];
            //运用MJExtension.h 将字典给我转换成模型
            XZStatusModel *statusModel = [XZStatusModel mj_objectWithKeyValues:dict];
            //添加到数组中
            [newArrayM addObject:statusModel];
        }
        self.statuses = newArrayM;
    */
        //运用MJExtension.h 将字典给我转换成模型 mj_objectArrayWithKeyValuesArray
        //将微博字典数组 转换为 微博模型 数组
        NSArray *newStatuses = [XZStatusModel mj_objectArrayWithKeyValuesArray:responseObject[@"statuses"]];
        //statusModel数组转为 statusFrame 数组
        NSArray *newFrames = [self stausFramesWithStatuses:newStatuses];
        
        //将微博数据添加到总数组后面
        [self.statusesFrames addObjectsFromArray:newFrames];
        [self.tableView reloadData];
        // 结束刷新(隐藏footer)
        self.tableView.tableFooterView.hidden = YES;
    } failure:^(AFHTTPRequestOperation * _Nullable operation, NSError * _Nonnull error) {
        XZLog(@"失败%@",error);
        // 结束刷新(隐藏footer)
        self.tableView.tableFooterView.hidden = YES;
    }];

}
/**
 *  获得用户信息（昵称）
 */
- (void)setUpUserInfo{
    
    //面向模型开发
    XZAccoutnModel *account = [XZAccoutnTool account];
    
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    
    NSMutableDictionary *param = [NSMutableDictionary dictionary];
    
    //param[@"access_token"] = @"2.00ipE2DD02JOyN0e38dbe9f816XdVB";
    //param[@"uid"]          = @2797750974;
    param[@"access_token"] = account.access_token;
    param[@"uid"]          = account.uid;
   
    [manager GET:XZURLUserInfo parameters:param success:^(AFHTTPRequestOperation
                                                          * _Nonnull operation,
                                                          id  _Nonnull responseObject) {
       // XZLog(@"成功Dict=%@",responseObject);
       // XZUserModel *user = [XZUserModel userModelDict:responseObject];
        //运用MJExtension.h 将字典给我转换成模型
        XZUserModel *user = [XZUserModel mj_objectWithKeyValues:responseObject];
        [self.titleBtn setTitle:user.name forState:UIControlStateNormal];
       //写入沙盒存储起来
        account.name = user.name;
        [XZAccoutnTool saveAccoutnModel:account];
        
    } failure:^(AFHTTPRequestOperation * _Nullable operation, NSError * _Nonnull error) {
        XZLog(@"失败%@",error);
    }];
    
}
/**
 * 设置导航栏内容
 */
- (void)setTitleBtn {
    //设置右边按钮
    self.navigationItem.rightBarButtonItem = [UIBarButtonItem itemWithTarget:nil action:nil image:@"navigationbar_pop" highImage:@"navigationbar_pop_highlighted"];
    //设置左边按钮
    self.navigationItem.leftBarButtonItem = [UIBarButtonItem itemWithTarget:nil action:nil image:@"navigationbar_friendsearch" highImage:@"navigationbar_friendsearch_highlighted"];
    
    XZTitleButton *titleBtn = [[XZTitleButton alloc] init];
     self.navigationItem.titleView = titleBtn;
    //取出用户name赋值
    NSString *name = [XZAccoutnTool account].name;
    [titleBtn setTitle:name?name:@"首页" forState:UIControlStateNormal];
    //按钮自适应,里文字图片有多大按钮就有多大
   // [titleBtn sizeToFit];
    // 如果图片的某个方向上不规则，比如有突起，那么这个方向就不能拉伸
    // 什么情况下建议使用imageEdgeInsets、titleEdgeInsets
    // 如果按钮内部的图片、文字固定，用这2个属性来设置间距，会比较简单
    // 标题宽度
    //    CGFloat titleW = titleButton.titleLabel.width * [UIScreen mainScreen].scale;
    ////    // 乘上scale系数，保证retina屏幕上的图片宽度是正确的
    //    CGFloat imageW = titleButton.imageView.width * [UIScreen mainScreen].scale;
    //    CGFloat left = titleW + imageW;
    //    titleButton.imageEdgeInsets = UIEdgeInsetsMake(0, left, 0, 0);  titleBtn.titleLabel.backgroundColor = XZRandomColor;
    //titleBtn.backgroundColor = XZRandomColor;
    //titleBtn.imageView.backgroundColor = XZRandomColor;

    //监听点击
    [titleBtn addTarget:self action:@selector(titleClick:) forControlEvents:UIControlEventTouchUpInside];
    self.titleBtn = titleBtn;
   
   
  
}
/**
 *  标题点击
 */
- (void)titleClick:(UIButton *)titleButton {

    //封装MenuView
    XZDropdownMenu *menu = [XZDropdownMenu dropdownMenu];
    menu.delegate = self;
    //封装tableView
    XZTitleMeanController *titleVc = [[XZTitleMeanController alloc] init];
    titleVc.view.height = 150;
    titleVc.view.width = 150;
    menu.contentController = titleVc;
    //显示
    [menu showFrom:titleButton];
 
}
#pragma mark---XZDropdownMenuDelegate
- (void)dropdownMenuDidDismiss:(XZDropdownMenu *)menu{

   // UIButton *titlBtn = (UIButton *)self.navigationItem.titleView;
    self.titleBtn.selected = NO;
}

- (void)dropdownMenuDidShow:(XZDropdownMenu *)menu{

    //UIButton *titlBtn = (UIButton *)self.navigationItem.titleView;
   self.titleBtn.selected = YES;

}
#pragma mark--UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

    return self.statusesFrames.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    XZHomeStatusCell *cell = [XZHomeStatusCell cellWithTableView:tableView];
   cell.statusFrame  = self.statusesFrames[indexPath.row];
    /*
    //面向模型开发
    XZStatusModel *status =  self.statusesFrame[indexPath.row];
    XZUserModel *user =  status.user;
    cell.textLabel.text = user.name;
    cell.detailTextLabel.text = status.text;
    UIImage *image = [UIImage imageNamed:@"avatar_default_small"];
    //图片下载管理
    [cell.imageView sd_setImageWithURL:[NSURL URLWithString:user.profile_image_url] placeholderImage:image];
    */
    return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    XZStatusFrame *frame = self.statusesFrames[indexPath.row];
    return frame.cellHeight;
}

@end
